#ifndef DATA_H
#define DATA_H

#include <QString>
#include <QFileInfo>
#include <QFile>
#include <QPixmap>
#include <QIcon>

#include "base.qpb.h"
#include "user.qpb.h"
#include "gateway.qpb.h"
#include "friend.qpb.h"
#include "file.qpb.h"
#include "message.qpb.h"
#include "transmite.qpb.h"
#include "speech.qpb.h"
#include "notify.qpb.h"

static inline QString getFileName(const QString& path){
    QFileInfo fileInfo(path);
    return fileInfo.fileName();
}

#define TAG QString("[%1:%2]").arg(getFileName(__FILE__), QString::number(__LINE__))
//noquote 可以让日志打印的时候不再带上""
#define LOG() qDebug().noquote() << TAG

static inline QString formatTime(int64_t timestamp){
    //将时间戳转换为QDateTime
    QDateTime datetime = QDateTime::fromSecsSinceEpoch(timestamp);

    return datetime.toString("yyyy-MM-dd HH:mm:ss");
}

static inline int64_t getTime(){
    return QDateTime::currentSecsSinceEpoch();
}

// 生成默认的 UserInfo 对象
static inline lch_im::UserInfo createUserInfo(int index, const QByteArray& avatar) {
    lch_im::UserInfo userInfo;
    userInfo.setUserId(QString::number(1000 + index));
    userInfo.setNickname("李四" + QString::number(index));
    userInfo.setDescription("个性签名" + QString::number(index));
    userInfo.setPhone("15310432984");
    userInfo.setAvatar(avatar);
    return userInfo;
}

// 生成默认的 MessageInfo 对象. 文本消息
static inline lch_im::MessageInfo createTextMessageInfo(int index, const QString& chatSessionId, const QByteArray& avatar) {
    lch_im::MessageInfo messageInfo;
    messageInfo.setMessageId(QString::number(3000 + index));
    messageInfo.setChatSessionId(chatSessionId);
    messageInfo.setTimestamp(getTime());
    messageInfo.setSender(createUserInfo(index, avatar));

    lch_im::StringMessageInfo stringMessageInfo;
    stringMessageInfo.setContent("这是一条消息内容" + QString::number(index));

    lch_im::MessageContent messageContent;
    messageContent.setMessageType(lch_im::MessageTypeGadget::MessageType::STRING);
    messageContent.setStringMessage(stringMessageInfo);
    messageInfo.setMessage(messageContent);
    return messageInfo;
}


static inline lch_im::MessageInfo createImageMessageInfo(int index, const QString& chatSessionId, const QByteArray& avatar) {
    lch_im::MessageInfo messageInfo;
    messageInfo.setMessageId(QString::number(3000 + index));
    messageInfo.setChatSessionId(chatSessionId);
    messageInfo.setTimestamp(getTime());
    messageInfo.setSender(createUserInfo(index, avatar));

    lch_im::ImageMessageInfo imageMessageInfo;
    imageMessageInfo.setFileId("testImage");
    // 真实服务器推送的消息数据里, 本身也就不带图片的正文. 只是 fileId.
    // 需要通过 fileId, 二次发起请求, 通过 getSingleFile 接口来获取到内容.
    // imageMessageInfo.setImageContent();

    lch_im::MessageContent messageContent;
    messageContent.setMessageType(lch_im::MessageTypeGadget::MessageType::IMAGE);
    messageContent.setImageMessage(imageMessageInfo);
    messageInfo.setMessage(messageContent);
    return messageInfo;
}

static inline lch_im::MessageInfo createFileMessageInfo(int index, const QString& chatSessionId, const QByteArray& avatar) {
    lch_im::MessageInfo messageInfo;
    messageInfo.setMessageId(QString::number(3000 + index));
    messageInfo.setChatSessionId(chatSessionId);
    messageInfo.setTimestamp(getTime());
    messageInfo.setSender(createUserInfo(index, avatar));

    lch_im::FileMessageInfo fileMessageInfo;
    fileMessageInfo.setFileId("testFile");
    // 真实服务器推送的消息数据里, 本身也就不带图片的正文. 只是 fileId.
    // 需要通过 fileId, 二次发起请求, 通过 getSingleFile 接口来获取到内容.
    fileMessageInfo.setFileName("test.txt");
    // 此处文件大小, 无法设置. 由于 fileSize 属性, 不是 optional , 此处先设置一个 0 进来
    fileMessageInfo.setFileSize(0);

    lch_im::MessageContent messageContent;
    messageContent.setMessageType(lch_im::MessageTypeGadget::MessageType::FILE);
    messageContent.setFileMessage(fileMessageInfo);
    messageInfo.setMessage(messageContent);
    return messageInfo;
}

static inline lch_im::MessageInfo createSpeechMessageInfo(int index, const QString& chatSessionId, const QByteArray& avatar) {
    lch_im::MessageInfo messageInfo;
    messageInfo.setMessageId(QString::number(3000 + index));
    messageInfo.setChatSessionId(chatSessionId);
    messageInfo.setTimestamp(getTime());
    messageInfo.setSender(createUserInfo(index, avatar));

    lch_im::SpeechMessageInfo speechMessageInfo;
    // 真实服务器推送的消息数据里, 本身也就不带图片的正文. 只是 fileId.
    // 需要通过 fileId, 二次发起请求, 通过 getSingleFile 接口来获取到内容.
    speechMessageInfo.setFileId("testSpeech");

    lch_im::MessageContent messageContent;
    messageContent.setMessageType(lch_im::MessageTypeGadget::MessageType::SPEECH);
    messageContent.setSpeechMessage(speechMessageInfo);
    messageInfo.setMessage(messageContent);
    return messageInfo;
}


//根据QByteArray 转换为 QIcon
static inline QIcon createIcon(const QByteArray& byteArray){
    QPixmap pixmap;
    pixmap.loadFromData(byteArray);
    QIcon icon(pixmap);
    return icon;
}

//  读写文件操作
//  从指定的文件中读取所有的二进制内容，得到QByteArray
static inline QByteArray loadFileToQByteArray(const QString& path){
    QFile file(path);

    bool ok = file.open(QFile::ReadOnly);
    if(!ok){
        qDebug() << "文件打开失败";
        return QByteArray();
    }

    QByteArray content = file.readAll();
    file.close();
    return content;
}

//  将QByteArray写到指定的文件中
static inline void writeByteArrayToFile(const QString& path,const QByteArray& content){
    QFile file(path);
    bool ok = file.open(QFile::WriteOnly);
    if(!ok){
        qDebug() << "文件打开失败";
        return;
    }

    file.write(content);
    file.flush();
    file.close();
}

#endif // DATA_H
